home *** CD-ROM | disk | FTP | other *** search
- /* pnmpad.c - add border to sides of a portable anymap
- ** (C) 1994 Rolf Mayer, Rolf.Mayer@rz.uni-karlsruhe.de
- ** based on pnmpad (C) 1990 Angus Duggan (C) 1989 Jef Poskanzer
- */
-
- #include <stdio.h>
- #include "pnm.h"
-
- int
- main(argc, argv)
- int argc;
- char *argv[];
- {
- FILE *ifd;
- xel *xelrow, *bgrow, background;
- xelval maxval;
- int rows, cols, newcols, row, col, format;
- int left, right, top, bot, black, factor, framex, framey, minframe;
- char *usage = "[-white|-black] [-l#] [-r#] [-t#] [-b#] [-d#] [-m#] [pnmfile]";
-
-
- pnm_init( &argc, argv );
-
- black = 1;
- left = right = top = bot = factor = framex = framey = minframe = 0;
-
- while (argc >= 2 && argv[1][0] == '-') {
- if (strcmp(argv[1]+1,"black") == 0) black = 1;
- else if (strcmp(argv[1]+1,"white") == 0) black = 0;
- else switch (argv[1][1]) {
- case 'l':
- if ((left = atoi(argv[1]+2)) < 0)
- pm_error("left border too small");
- break;
- case 'r':
- if ((right = atoi(argv[1]+2)) < 0)
- pm_error("right border too small");
- break;
- case 'b':
- if ((bot = atoi(argv[1]+2)) < 0)
- pm_error("bottom border too small");
- break;
- case 't':
- if ((top = atoi(argv[1]+2)) < 0)
- pm_error("top border too small");
- break;
- case 'd':
- if ((factor= atoi(argv[1]+2)) < 1)
- pm_error("denominator to small (must be > 1)");
- break;
- case 'm':
- if ((minframe= atoi(argv[1]+2)) < 0)
- pm_error("minimum frame to small");
- break;
- default:
- pm_usage(usage);
- }
- argc--, argv++;
- }
-
- if (argc > 2)
- pm_usage(usage);
-
- if (argc == 2)
- ifd = pm_openr(argv[1]);
- else
- ifd = stdin;
-
-
-
- pnm_readpnminit(ifd, &cols, &rows, &maxval, &format);
- if (black)
- background = pnm_blackxel(maxval, format);
- else
- background = pnm_whitexel(maxval, format);
-
- if (cols == 0 || rows == 0) {
- pm_message("empty bitmap");
- left = right = bot = top = 0;
- }
-
- if (factor) {
- pm_message("options -l -r -t -b ignored");
- framex=cols/factor;
- framey=cols/factor;
- if (minframe) {
- if (framex<=minframe && framey<=minframe) {
- framex=minframe;
- framey=minframe;
- }
- }
- if (framex < framey)
- framey=framex;
- if (framey < framex)
- framex=framey;
- left = right = top = bot = framex;
- }
- if (minframe && factor==0) {
- if (left<=minframe)
- left = minframe;
- if (right<=minframe)
- right = minframe;
- if (bot<=minframe)
- bot= minframe;
- if (top<=minframe)
- top= minframe;
- }
- newcols = cols+left+right;
- xelrow = pnm_allocrow(newcols);
- bgrow = pnm_allocrow(newcols);
-
- for (col = 0; col < newcols; col++)
- xelrow[col] = bgrow[col] = background;
-
- pnm_writepnminit(stdout, newcols, rows+top+bot, maxval, format, 0);
-
- for (row = 0; row < top; row++)
- pnm_writepnmrow(stdout, bgrow, newcols, maxval, format, 0);
-
- for (row = 0; row < rows; row++) {
- pnm_readpnmrow(ifd, xelrow+left, cols, maxval, format);
- pnm_writepnmrow(stdout, xelrow, newcols, maxval, format, 0);
- }
-
- for (row = 0; row < bot; row++)
- pnm_writepnmrow(stdout, bgrow, newcols, maxval, format, 0);
-
- pm_close(ifd);
-
- exit(0);
- }
-